home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume2 / intuitin / waranger.1 < prev   
Internet Message Format  |  1988-11-18  |  16KB

  1. Path: xanth!mcnc!rutgers!mit-eddie!ll-xn!adelie!infinet!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v02i063:  warranger - window arranger v1.25
  5. Message-ID: <10260@swan.ulowell.edu>
  6. Date: 18 Nov 88 04:38:24 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 548
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: schabacker@frambo.DEC.COM (Tim, posting for Christian Balzer)
  12. Posting-number: Volume 2, Issue 63
  13. Archive-name: intuition/warranger.1
  14.  
  15. WindowArranger is an update to the one on Fish #139.
  16. If there are any questions, email me.
  17.  
  18. [uuencoded binary also here, because it's small and the
  19. redistribution requirements state that it must be.  ..Bob]
  20.  
  21. #    This is a shell archive.
  22. #    Remove everything above and including the cut line.
  23. #    Then run the rest of the file through sh.
  24. #----cut here-----cut here-----cut here-----cut here----#
  25. #!/bin/sh
  26. # shar:    Shell Archiver
  27. #    Run the following text with /bin/sh to create:
  28. #    Warranger.asm
  29. #    Warranger.uu
  30. # This archive created: Thu Nov 17 23:32:19 1988
  31. cat << \SHAR_EOF > Warranger.asm
  32. ;*****************************************************************************
  33. ;*
  34. ;*        WindowArranger.asm (assembler version)        05.11.88
  35. ;*                        by Heiko Rath
  36. ;*
  37. ;* This little goodie is able to send a window to front or back. I wrote it
  38. ;* for <CB> who wanted to bring his AMICRON window to front if an event
  39. ;* occured.
  40. ;*
  41. ;* A short description:
  42. ;* The program first trys to open the 'dos.library', if it had success to do
  43. ;* so it trys to parse your input string. If it can't understand what you want
  44. ;* it gives you help how to use it. If it is able to parse your input it trys
  45. ;* to open 'intuition.library' and to find a window with a matching name. If
  46. ;* there is one it rearranges it to front or to back. After this it closes
  47. ;* the 'intuition.library' & the 'dos.library'.
  48. ;*
  49. ;* Changes since version 1.00 on Fish disk #139:
  50. ;* Fixed "Infinity Loop while IntuitionLock" bug that occured when a screen
  51. ;* with no window (like DMouse or PopCLI) was in front.
  52. ;*
  53. ;* Thanx to Larry Phillips, (CIS -76703,4322) & C.Heath.
  54. ;*****************************************************************************
  55. ;*
  56. ;* This program is
  57. ;* 
  58. ;* Copyright (c) 1988 by Heiko Rath and the Software Brewery.
  59. ;*
  60. ;* It may be freely distributed for non-profit only.
  61. ;* The distribution must contain ALL parts, in this case the following
  62. ;* files:
  63. ;*
  64. ;* Warranger
  65. ;* Warranger.asm
  66. ;* 
  67. ;* Putting it on a commercial product is usually as easy as sending
  68. ;* a letter to the author.
  69. ;*
  70. ;* If you like this program you can do one of the following things:
  71. ;*
  72. ;* 1.    absolutly nothing
  73. ;* 2.    send me something I deserve:
  74. ;*                money, yachts, beer, Marabou chocolate
  75. ;* 3.    contact us at:
  76. ;*
  77. ;*                Heiko Rath
  78. ;*                Raiffeisenstr.10a
  79. ;*                D-6108 Weiterstadt
  80. ;*                WEST GERMANY
  81. ;*
  82. ;*                                     or
  83. ;*                          
  84. ;*                          
  85. ;* ______  /          
  86. ;* ______\O                     - The Software Brewery - 
  87. ;*       \\ 
  88. ;*        o           Sparkling, fresh software from West-Germany
  89. ;*           
  90. ;*      @@@@@             Straight from the bar to your Amiga
  91. ;*      |~~~|\ 
  92. ;*      | | |/ 
  93. ;*      |___|        With our regards to the Software Distillery
  94. ;* 
  95. ;* The Brewers are:
  96. ;* Christian Balzer alias <CB>, Lattice C, user interfaces, beer addict. 
  97. ;* Heiko Rath alias <HR>, Assembler, ROM-Kernal stuff, Marabou addict. 
  98. ;* Ralf Woitinas alias RAF, Assembler, anything, Ray-Tracing addict.
  99. ;* Andrew Kopp alias Charlie, Aztec C, Hardware & communications, beer addict.
  100. ;* Armin Sparr alias MARVIN, Aztec C, ARexx macros, Campari addict.
  101. ;* Christof Bonnkirch alias KEY, Aztec C, Hardware & Devices, beer adict.
  102. ;* 
  103. ;* Beverages: Altenmuenster Brauer Bier, Urfraenkisches Landbier, Jever.
  104. ;* 
  105. ;* Send exotic drinks, comments, flames to:
  106. ;* 
  107. ;* The Software Brewery    
  108. ;* Christian Balzer        UUCP: decwrl!frambo.dec.com!schabacker
  109. ;* Im Wingertsberg 45        ARPA: schabacker@frambo.dec.com
  110. ;* D-6108 Weiterstadt        CI$ : 71001,210 (be brief!)
  111. ;* West Germany (F.R.G.)    Fone: +49 6150 4151 (18:00-21:00 CET!)
  112. ;* 
  113.  
  114. Version        MACRO
  115.         dc.b    '1.25'
  116.         ENDM
  117.  
  118. ExecBase    Equ    4
  119.  
  120. ;*** Exec Offsets:
  121. FindTask    Equ    -294    ;(name)(a1)
  122. WaitPort    Equ    -384    ;(port)(a0)
  123. GetMsg        Equ    -372    ;(port)(a0)
  124. ReplyMsg    Equ    -378    ;(message)(a1)
  125. Forbid        Equ    -132    ;()()
  126. OpenLibrary    Equ    -552    ;(libName,version)(a1,d0)
  127. CloseLibrary    Equ    -414    ;(library)(a1)
  128. OldOpenLibrary    Equ    -408
  129. CLOSEWINDOW    Equ    $200    ;IDCMP-Flag CloseWindow
  130. WD_USERPORT    Equ    86    ;WD_UserPort
  131. IM_CLASS    Equ    20    ;Even Class
  132.  
  133. ;*** DOS Offsets:
  134.  
  135. Input        Equ    -54    ;()
  136. OutPut        Equ    -60    ;()
  137. Write        Equ    -48    ;(file, buffer, length)(d1,d2,d3)
  138.  
  139. ;*** Intuition Offsets:
  140.  
  141. OpenWindow    Equ    -204    ;(OWArgs)(a0)
  142. CloseWindow    Equ    -72    ;(Window)(a0)
  143. LockIBase    Equ    -414    ;(dontknow)(d0)
  144. UnlockIBase    Equ    -420    ;(IBlock)(a0)
  145. WindowToFront    Equ    -312    ;(Window)(a0)
  146. WindowToBack    Equ    -306    ;(Window)(a0)
  147. AutoRequest    Equ    -348    ;(Window,body,PText,NText,PFlags,NFlags,W,H)
  148.                 ;(a0,a1,a2,a3,d0,d1,d2)
  149.  
  150. timer        Equ    0
  151. GfxBase        Equ    2
  152. fac        Equ    6
  153. PR_CLI        Equ    172
  154. PR_MsgPort    Equ    92
  155.  
  156. ;*** Macro Definitions:
  157. push.w    MACRO
  158.     move.w    \1,-(sp)    ;push a word onto stack
  159.     ENDM
  160.  
  161. push.l    MACRO
  162.     move.l    \1,-(sp)    ;push a longword onto stack
  163.     ENDM
  164.  
  165. pop.w    MACRO
  166.     move.w    (sp)+,\1    ;pop a word from stack
  167.     ENDM
  168.  
  169. pop.l    MACRO
  170.     move.l    (sp)+,\1    ;pop a longword from stack
  171.     ENDM
  172.  
  173. pushm    MACRO
  174.     movem.l    \1,-(sp)    ;push several register on stack
  175.     ENDM
  176.  
  177. popm    MACRO
  178.     movem.l    (sp)+,\1    ;pop several register from stack
  179.     ENDM
  180.  
  181.  
  182. Amiga_Init:
  183.     move.l    sp,d6            ;save stack pointer
  184.  
  185.     move.l    a0,a2            ;register a2 is cmdline henceforth
  186.     clr.b    0(a2,d0.w)        ;make sure that cmdline is null terminated
  187.     push.w    d0            ;save cmdlength
  188.  
  189.     move.l    ExecBase,a6        ;get ExecBaseaddress to a6
  190.     suba.l    a1,a1            ;clear a1
  191.     jsr    FindTask(a6)        ;get pointer
  192.  
  193.     move.l    d0,a4            ;get process-pointer to a4
  194.     tst.l    PR_CLI(a4)        ;pr_CLI: CLI or WB?
  195.     bne    main            ;if <> 0 then CLI
  196.  
  197. fromWB:
  198.     lea    PR_MsgPort(a4),a0    ;pr_MsgPort: messageportaddress to a0
  199.     jsr    WaitPort(a6)        ;wait until message arrives
  200.     lea.l    PR_MsgPort(a4),a0    ;
  201.     jsr    GetMsg(a6)        ;get message
  202.     move.l    d0,a5            ;save return message in a5
  203.     moveq.l    #0,d0            ;any version
  204.     lea.l    INTName,a1        ;get address of libraryname to a1
  205.     jsr    OpenLibrary(a6)        ;try to open Intuition
  206.     tst.l    d0            ;see if d0 = 0
  207.     beq    ErrorExit        ;ohh shit, failed to open Intuition
  208.     move.l    d0,a6            ;get Baseaddress of Intuition to a6
  209.     moveq.l    #0,d0            ;PFlag = 0
  210.     moveq.l    #0,d1            ;NFlag = 0
  211.     move.l    #320,d2            ;width 320
  212.     move.l    #68,d3            ;height 68
  213.     suba.l    a0,a0            ;clear a0
  214.     lea.l    ITextId,a1        ;get address of ITextId to a1
  215.     suba.l    a2,a2            ;PosText = 0
  216.     lea.l    ITextOk,a3        ;get address of NegText to a3
  217.     jsr    AutoRequest(a6)        ;display Autorequest
  218.     move.l    a6,a1            ;get INTBase to a1
  219.     move.l    ExecBase,a6        ;get ExecBase to a6
  220.     jsr    CloseLibrary(a6)    ;close Intuition
  221.  
  222.     jsr    Forbid(a6)        ;we have to do this, so that WB can't
  223.                     ; unload us to far
  224.     move.l    a5,a1            ;get address of ReturnMessage to a1
  225.     jsr    ReplyMsg(a6)        ;reply the message
  226.     pop.w    d0
  227. ErrorExit:
  228.     rts
  229.  
  230. main:
  231.     move.l    ExecBase,a6        ;ExecBase to a6
  232.     lea    DOSName(pc),a1        ;Address of string 'dos.library',0
  233.     jsr    OldOpenLibrary(a6)    ;open library
  234.     move.l    d0,DOSBase        ;save DOSBaseaddress
  235.     beq    Exit            ;if d0=0 then Exit (System is realy sick!)
  236.     move.l    D0,A6            ;move DOSBasepointer to a6
  237.     jsr    OutPut(A6)        ;identify the initial output handle
  238.     move.l    D0,stdout        ;save stdout
  239.  
  240.     pop.w    d0            ;get cmdlength
  241. SkipSP:    
  242.     move.b    (a2)+,d1        ;skip spaces
  243.     beq.b    ShowHow            ;if NULL-String then /* help */
  244.     cmp.b    #' ',d1            ;is it a Space ?
  245.     beq.b    SkipSP            ;yes -> SkipSP
  246.  
  247.     sub.l    #1,a2
  248.     move.l    a2,StringAddress    ;store windownamestart
  249.     add.l    #1,a2
  250.  
  251.     cmp.b    #$0a,d1            ;is it #$0a ?
  252.     beq.b    ShowHow            ;yes -> ShowHow /* help */
  253.  
  254.     cmp.b    #'?',d1            ;is it '?' ?
  255.     beq.b    ShowHow            ;yes -> ShowHow /* help required */
  256.  
  257.     cmp.b    #'"',d1            ;is it '"' ?
  258.     beq.b    DoQuotes        ;yes -> DoQuotes
  259.  
  260. DoTheMainParsing:
  261.     cmp.b    #'-',d1            ;is it '-' ?
  262.     beq.b    Parser            ;yes -> Parser /* see if -f or -b */
  263.     move.b    (a2)+,d1        ;get the next byte
  264.     bne.b    DoTheMainParsing    ;-> DoTheMainParsing
  265.  
  266. ShowHow:
  267.     lea    HelpString(pc),a0    ;give the user help
  268.     move.l    a0,d2            ;copy address of string to d2
  269.     bsr    TextOutPut        ;output text via Amiga-Dog
  270.     bra    DosClose        ;close DOS
  271.  
  272. DoQuotes:
  273.     move.l    a2,StringAddress    ;store address of string
  274. QuotesLoop:
  275.     move.b    (a2)+,d1        ;get the next character
  276.     beq.b    ShowHow            ;if we have reached the end -> ShowHow
  277.     cmp.b    #'"',d1            ;is it '"' ?
  278.     bne.b    QuotesLoop        ;no ->QuotesLoop
  279.     move.b    #0,-(a2)        ;clear the last '"'
  280.     addq.l    #1,a2
  281.     bra.b    DoTheMainParsing    ;-> DoTheMainParsing
  282.  
  283.  
  284. Parser:
  285.     move.b    #0,-(a2)
  286.  
  287.     add.l    #1,a2
  288.     move.b    (a2),d1
  289.     and.b    #%11011111,d1        ;convert lowercase to uppercase
  290.     cmp.b    #'F',d1
  291.     beq.b    Front
  292.     cmp.b    #'B',d1
  293.     beq.b    Back
  294.     bra.b    ShowHow
  295.  
  296. Front:    push.w    #'FR'            ;this is only to remember that the user
  297.                     ; wanted '-f'
  298.     bra.b    Intuitionopen
  299.  
  300. Back:    push.w    #'BA'
  301.  
  302. Intuitionopen:                ;try to open Intuition
  303.     move.l    ExecBase,a6
  304.     lea    INTName,a1
  305.     jsr    OldOpenLibrary(a6)
  306.     move.l    d0,IntuitionBase    ;save IntuitionBase
  307.     beq    DosClose        ;if d0=0 then DosClose (Unable to open Intuition)
  308.     move.l    d0,a6            ;copy IntuitionBase to a6
  309.     moveq    #0,d0            ;clear d0
  310.     jsr    LockIBase(a6)        ;lock Intuition
  311.     move.l    d0,MyLock        ;store lock
  312.  
  313.     move.l    60(a6),d0        ;get address of first screen
  314.     beq    Same            ;if d0=0 then /* there is no
  315.                     ; Screen !? */
  316.     move.l    d0,ScreenPointer    ;store address of screen
  317.     move.l    d0,a0
  318. GetFirst:
  319.     move.l    4(a0),d0        ;get address of 1. Window
  320.     move.l    d0,a2
  321.     tst.l    d0            ;is d0=0?
  322.     beq    NextScreen        ;if a2=0 then /* there is no
  323.                     ; window in this screen */
  324. ****                         ****
  325. * Compare the name of the windowtitle with a string *
  326. * if equal then rearrange window            *
  327. *****                         ****
  328. DoCompare:
  329.     move.l    StringAddress,a1    ;get address of String to a1
  330.     move.l    32(a2),d0        ;get address of windowtitle to d0
  331.     beq.b    NotTheSame
  332.     move.l    d0,a0
  333. 001$:
  334.     move.b    (a0)+,d0        ;copy one byte to d0
  335.     move.b    (a1)+,d1        ;copy one byte to d1
  336.     and.b    #%11011111,d0        ;convert lowercase to uppercase
  337.     and.b    #%11011111,d1        ;convert lowercase to uppercase
  338.     cmp.b    d0,d1            ;see if equal
  339.     bne.b    NotTheSame        ;if no then -> NotTheSame    
  340.     tst.b    d0            ;see if NULL
  341.     beq.b    Same            ;if yes then -> Same
  342.     bra.b    001$            ;-> 001$
  343.  
  344. NotTheSame:
  345.     move.l    (a2),d0            ;get address of next window
  346.     move.l    d0,a2            ;copy address to a2
  347.     tst.l    d0            ;is d0=0?
  348.     bne.b    DoCompare        ;look at the next windowtitle
  349.                     ;if a2=0 then/* this was the last window */
  350. NextScreen:
  351.     move.l    ScreenPointer,a0
  352.     move.l    (a0),a0            ;get address of next screen
  353.     move.l    a0,d0
  354.     tst.l    d0            ;is a0=0?
  355.     beq.b    NotFound        ;if a0=0 then /* no more screens */
  356.     move.l    a0,ScreenPointer
  357.     bra.b    GetFirst        ;get first windowaddress
  358.  
  359. NotFound:
  360.     pop.w    d0
  361.     move.l    MyLock,a0        ;get lockvalue
  362.     jsr    UnlockIBase(a6)        ;unlock Intuition
  363.     lea    HelpString(pc),a0    ;get address of Helpstring to a0
  364.     move.l    a0,d2            ;copy address to d2
  365.     bsr    TextOutPut        ;output text
  366.     lea    NotFoundString(pc),a0    ;get address of NotFoundString to a0
  367.     move.l    a0,d2            ;copy address to d2
  368.     bsr    TextOutPut        ;output text
  369.     bra.b    NoScreen        ;-> NoScreen
  370.  
  371. Same:
  372.     move.l    MyLock,a0        ;get lockvalue
  373.     jsr    UnlockIBase(a6)        ;unlock Intuition
  374.  
  375.     move.l    a2,a0            ;copy windowaddress to a0
  376.     pop.w    d0
  377.     cmp.w    #'BA',d0
  378.     beq.b    MoveToBack 
  379.     cmp.w    #'FR',d0
  380.     bne.b    NoScreen
  381.     jsr    WindowToFront(a6)    ;window to front
  382.     bra.b    NoScreen
  383.  
  384. MoveToBack:
  385.     jsr    WindowToBack(a6)    ;window to back
  386.  
  387. NoScreen:
  388.  
  389. Intuitionclose:                ;close Intuition
  390.     move.l    ExecBase,a6
  391.     move.l    IntuitionBase,a1
  392.     jsr    CloseLibrary(a6)
  393.  
  394. DosClose:                ;close Amiga-DOG
  395.     move.l    ExecBase,a6
  396.     move.l    DOSBase,a1
  397.     jsr    CloseLibrary(a6)
  398. Exit:
  399.     move.l    #0,d0            ;no return-error
  400.     rts
  401.  
  402. ;*****************************************************************************
  403. ;*
  404. ;*    TextOutPut
  405. ;*            by    Heiko Rath
  406. ;*
  407. ;* PURPOSE:         output a NULL-terminated string via stdout
  408. ;*
  409. ;* ROUTINE TYPE:     subroutine
  410. ;*
  411. ;* SYNTAX:        bsr    TextOutPut    (stringaddress)(d2)
  412. ;*
  413. ;* ENTRY CONDITIONS:    needs DOSlibrary opened and stdout defined
  414. ;*            also needs DOS-'Write' offset -48 defined.
  415. ;*
  416. ;* RETURNS:        Text via DOS-stdout
  417. ;*
  418. ;* NOTE:        its better if the string is really NULL-terminated
  419. ;*
  420. ;* CHANGED:        nothing
  421. ;*
  422. ;* USAGE:        move.l    #Textaddress,d2
  423. ;*            bsr    TextOutPut
  424. ;*
  425. ;*****************************************************************************
  426.  
  427.  
  428.  
  429. TextOutPut:        ;TextOutPut (Textaddress)(d2)
  430.             ;prints a NULL-terminated string via stdout
  431.             ;changed: nothing
  432.     movem.l    d0-d7/a0-a6,-(sp)    ;save registers
  433.     move.l    d2,a0            ;address to a0
  434.     clr.l    d3            ;count = 0
  435. CountLoop:
  436.     tst.b    (a0)+            ;is it NULL ?
  437.     beq.b    PMsg            ;yes: -=> determine length
  438.     addq.l    #1,d3            ;count = count+1
  439.     bra.b    CountLoop        ;test next byte
  440. PMsg:
  441.     move.l    stdout,d1        ;get stdout to d1
  442.     move.l    DOSBase,a6        ;move DOSBase to a6
  443.     jsr    Write(a6)        ;write the Text
  444.     movem.l    (sp)+,a0-a6/d0-d7    ;reserve registers
  445.     rts
  446.  
  447. ;*** variables:
  448.  
  449. DOSBase        dc.l    0            ;pointer to the DOSBaseaddress
  450. stdout        dc.l    0            ;pointer to standard output
  451. IntuitionBase:                    ;address of Intuitionbase
  452.         dc.l    0
  453. UserPort:
  454.         dc.l    0
  455. MyLock        dc.l    0
  456. ScreenPointer    dc.l    0
  457. StringAddress    dc.l    0
  458.  
  459.         cnop    0,2
  460. ;*** constants:
  461. DOSName        dc.b    'dos.library',0        ;name of the DOS-library
  462. INTName        dc.b    'intuition.library',0    ;name of the Intuition-library
  463.  
  464.         cnop    0,2
  465.  
  466. HelpString:
  467.     dc.b    $9b,'0;33;40m','WindowArranger',$9b,'0;31;40m'
  468.     dc.b    ' by Heiko Rath - ',169,' 1987/88 by '
  469.     dc.b    $9b,'1;31;40m','The Software Brewery',$9b,'0;31;40m',10
  470.     dc.b    '  V.'
  471.     Version
  472.     dc.b    '       '
  473.     dc.b    'Raiffeisenstr.10a,D-6108 Weiterstadt,WEST GERMANY',10
  474.     dc.b    '               '
  475.     dc.b    'Send me: Mail, $$$$$, girls or Marabou chocolate.'
  476.     dc.b    10,10
  477.     dc.b    'To arrange a window use ',$9b,'0;33;40m'
  478.     dc.b    'WindowArranger ',$9b,'0;31;40m','name -f or '
  479.     dc.b    '-b',10
  480.     dc.b    $9b,'1;31;40m','f',$9b,'0;31;40m'
  481.     dc.b    '= window to front & '
  482.     dc.b    $9b,'1;31;40m','b',$9b,'0;31;40m'
  483.     dc.b    '= window to back',10
  484.     dc.b    0
  485.     cnop    0,2
  486. NotFoundString:
  487.         dc.b    $9b,'0;32;40m','Please give me a babel fish'
  488.         dc.b    ' or a new windowname!!',$9b,'0;31;40m',10,0
  489.  
  490.         cnop    0,2
  491. ******************************************************************************
  492. *
  493. *    This is the IntuitionTextStructure of the AutoRequester
  494. *
  495. ******************************************************************************
  496. ITextId:    dc.b    0,1,1,0         ;pens, drawmode and filler
  497.         dc.w    17,6         ;XY
  498.         dc.l    0         ;NULL for default font
  499.         dc.l    S1          ;pointer to text
  500.         dc.l    ITextId2     ;next IntuitText structure
  501. ITextId2    dc.b    0,1,1,0
  502.         dc.w    17,18
  503.         dc.l    0
  504.         dc.l    S2
  505.         dc.l    0
  506. ITextOk:    dc.b    0,1,1,0
  507.         dc.w    6,3
  508.         dc.l    0
  509.         dc.l    SOk
  510.         dc.l    0
  511.         cnop    0,2
  512. S1        dc.b    'WindowArranger must be',0
  513.         cnop    0,2
  514. S2        dc.b    'started from the CLI.',0
  515.         cnop    0,2
  516. SOk        dc.b    'Ok',0
  517.         cnop    0,2
  518. SHAR_EOF
  519. cat << \SHAR_EOF > Warranger.uu
  520.  
  521. begin 644 Warranger
  522. M```#\P`````````!``````````````$?```#Z0```1\L#R1(0C(``#\`+'@`A
  523. M!)/)3J[^VBA`2JP`K&8``%I![`!<3J[^@$'L`%Q.KOZ,*D!P`$/Z`@9.KOW8`
  524. M2H!G```V+$!P`'(`)#P```%`=D21R$/Z`[R5RD?Z`]Y.KOZD(DXL>``$3J[^6
  525. M8DZN_WPB34ZN_H8P'TYU+'@`!$/Z`;).KOYH(\````(29P`!8BQ`3J[_Q"/`C
  526. M```"%C`?$AIG+`P!`"!G]E.*(\H```(J4HH,`0`*9Q8,`0`_9Q`,`0`B9Q@,3
  527. M`0`M9RH2&F;V0?H!@"0(80`!'F```0HCR@```BH2&F?H#`$`(F;V%3P``%**F
  528. M8-`5/```4HH2$@(!`-\,`0!&9P@,`0!"9PA@P#\\1E)@!#\\0D$L>``$0_H!>
  529. M($ZN_F@CP````AIG``"X+$!P`$ZN_F(CP````B(@+@`\9P``="/````")B!`O
  530. M("@`!"1`2H!G```L(GH`U"`J`"!G&"!`$!@2&0(``-\"`0#?L@!F!DH`9SY@)
  531. MZB`2)$!*@&;6('H`IB!0(`A*@&<((\@```(F8+8P'R!Z`(Q.KOY<0?H`KB0(@
  532. M80``3$'Z`B`D"&$``$)@(B!Z`&Y.KOY<($HP'PQ`0D%G#`Q`1E)F"DZN_LA@J
  533. M!$ZN_LXL>``$(GH`0$ZN_F(L>``$(GH`+$ZN_F)P`$YU2.?__B!"0H-*&&<$+
  534. M4H-@^"(Z`!0L>@`,3J[_T$S??_].=0``````````````````````````````&
  535. M``````!D;W,N;&EB<F%R>0!I;G1U:71I;VXN;&EB<F%R>0";,#LS,SLT,&U7^
  536. M:6YD;W=!<G)A;F=E<ILP.S,Q.S0P;2!B>2!(96EK;R!2871H("T@J2`Q.3@W2
  537. M+S@X(&)Y()LQ.S,Q.S0P;51H92!3;V9T=V%R92!"<F5W97)YFS`[,S$[-#!MS
  538. M"B`@5BXQ+C(U("`@("`@(%)A:69F96ES96YS='(N,3!A+$0M-C$P."!796ET>
  539. M97)S=&%D="Q715-4($=%4DU!3ED*("`@("`@("`@("`@("`@4V5N9"!M93H@9
  540. M36%I;"P@)"0D)"0L(&=I<FQS(&]R($UA<F%B;W4@8VAO8V]L871E+@H*5&\@/
  541. M87)R86YG92!A('=I;F1O=R!U<V4@FS`[,S,[-#!M5VEN9&]W07)R86YG97(@H
  542. MFS`[,S$[-#!M;F%M92`M9B!O<B`M8@J;,3LS,3LT,&UFFS`[,S$[-#!M/2!WK
  543. M:6YD;W<@=&\@9G)O;G0@)B";,3LS,3LT,&UBFS`[,S$[-#!M/2!W:6YD;W<@W
  544. M=&\@8F%C:PH``)LP.S,R.S0P;5!L96%S92!G:79E(&UE(&$@8F%B96P@9FESE
  545. M:"!O<B!A(&YE=R!W:6YD;W=N86UE(2&;,#LS,3LT,&T*`````0$``!$`!@``(
  546. M``````1*```$(@`!`0``$0`2````````!&(```````$!```&``,````````$.
  547. M>`````!7:6YD;W=!<G)A;F=E<B!M=7-T(&)E``!S=&%R=&5D(&9R;VT@=&AE>
  548. M($-,22X`3VL``````^P````,`````````(0```"4````J````-H```$B```!9
  549. A-````4(```&,```$&@``!!X```0N```$0@````````/RQ
  550. ``
  551. end
  552. size 1248
  553. SHAR_EOF
  554. #    End of shell archive
  555. exit 0
  556. -- 
  557. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  558. Have five nice days.
  559.